#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
//测试进程终止
int add_to_top(int top)
{
  printf("enter add_to_top\n");
  int sum = 0;
  for(int i = 0; i < top; i++)
  {
    sum += i;
  }
  //exit(110);
  _exit(119);
  printf("out add_to_top\n");
  return sum;
}

//测试进程等待
int main()
{
  pid_t id = fork();
  if(id == 0)
  { //子进程
    //子进程跑五次
     int cnt = 5;
     while(cnt)
     {
       printf("我是子进程，我还活着，剩余时间:%ds,pid:%d,ppid:%d\n",\
           cnt--,getpid(),getppid());
       sleep(1);
     }
     exit(107);
   }
  //父进程
  //非阻塞轮询
  while(1)
  {
  int status = 0;
  pid_t ret_id = waitpid(id,&status,WNOHANG);
  if(ret_id < 0)
  {
    perror("waitpid");
    exit(1);
  }else if(ret_id == 0)
  {
    printf("子进程还没退出呢，我再做做其它事...\n");
    continue;
  }else 
  {
  printf("我是父进程，等待子进程成功，pid:%d,ppid:%d,ret_id:%d,exist code:%d,exist signal:%d\n", getpid(),getppid(),ret_id,(status>>8)&0xFF,status&0x7F);
  break;
  }
  }
  //printf("我是父进程，等待子进程成功，pid:%d,ppid:%d,ret_id:%d,child status:%d\n",\
//      getpid(),getppid(),ret_id,status);
  //sleep(10);
  //pid_t ret_id = wait(NULL); //等待子进程
  //printf("我是父进程，等待子进程成功，pid:%d,ppid:%d,ret_id:%d\n",\
  //    getpid(),getppid(),ret_id);
  //sleep(5);
 // printf("hello world");
 // sleep(2);
 //// exit(123);
 // _exit(124);
  //for(int i = 0;i <= 200;i++)
  //{
  //    printf("%d : %s\n",i,strerror(i));
  //    exit(127);
  //}
    //获取1+...+n的值
  // int result = add_to_top(100);
  //  //返回不同的退出码
  //  if(result == 5050) return 0;
  //    else return 1;
  //  return 0;
}
